; Exam2019H31tP3 ΏۃrbgS0ɂB
;邢͑ΏۃrbgSPɂB
MAIN START
	LAD GR7,      BITAREA1
	ST GR7,ADRBAREA
   		 LAD   GR1  ,  ADRBAREA
	CALL BITSON
	;----------------
	LAD     GR7,  	BITAREA2
	ST GR7,ADRBAREA
	LAD GR1,ADRBAREA
	CALL BITSOFF
	;------------------
	LAD GR7,BITAREA3
	ST GR7,ADRBAREA
	LAD GR1,ADRBAREA
	CALL BITSON
	RET
ADRBAREA DS 1
BITPOS 	DC 18
LEN 	DC 32
BITAREA1 DC 0, 0, 0, 0
BITAREA2 DC #FFFF,#FFFF,#FFFF,#FFFF
BITAREA3 DC #A84D,#94CF,#72B5,#3E61 
	END
;--------------------
; Ώۃrbg̑SrbgPɂ鏈̂߂̃vO
BITSON 	START
	RPUSH
	LAD GR7,SETOP
	CALL BITSOP
	RPOP
	RET
	END
;-------------------------------
;Ώۃrbg̑Srbg[ɂ鏈̂߂̃vO
BITSOFF 	START
	RPUSH
	LAD GR7,RESETOP
	CALL BITSOP
	RPOP
	RET
	END
;---------------
BITSOP START
	RPUSH
	LD GR3,1,GR1 ; GR3 rbgʒu(BITPOS)
;rbgʒuA΃AhXifqQj
;rbgCfbNXifqRjɕϊB
	LD   GR2,GR3
	SRL GR2,4 ; a I
	; rbgʒuPȔ΃AhX GR2
 	AND GR3,=#000F
	; rbgʒuPUŊ]肪rbgCfbNƓłB
	LD GR4,2,GR1 ; GR4: rbgilj
;irbgCfbNX{rbg)PŮԁArbgs
LOOP	LD GR0,GR4
	ADDL GR0,GR3
	CPL GR0,BITSPW
	JMI BREAK
	LD GR5,BITSPW ; GR5: őΏۂƂȂrbg
	LD 		GR3,GR3
	JZE FULL
	;rbgCfbNX[Ȃ΁A
	;PUrbgS(FULL)ɃrbgsB
	SUBL GR5,GR3 ; b I rbgCfbNX炷B
	SUBL GR3,GR3 ; GR3 <-- 0
FULL 	SUBL GR4,GR5 ; 삷rbgrbg炷B
	;---------------------
	LD GR0, = 1 ; rbg}XN쐬Jn
	SLL GR0,0,GR5
	SUBL GR0,   =1 ; GR0: rbg}XN쐬
	;-----------------------
	CALL 0,GR7
	ADDL GR2, =1 ; GR2: ̌̑΃AhX
	JUMP LOOP
BREAK	LD GR4,GR4 ;̑ΏۂƂȂ関̃rbgH
	JZE FIN; c I
;̃rbg̉El߂̃rbg}XN𐶐A
;KvȃrbgփVtg
	;-----------------------
	LD GR0,=1 ; rbg}XN쐬Jn
	SLL GR0,  0,   GR4
	SUBL GR0,=1 ; rbg}XN GR0@
	; rbg}XN̕KvȐ̃rbg͍쐬łA
	; K؂Ȉʒu܂荶l߂ɈړKvB
	;----------------------
	LD GR5,BITSPW
	SUBL GR5,GR3
	 SUBL GR5,GR4 ; d J
	SLL GR0,0,GR5 ; GR0:@rbg}XN
	; l߂Ɉړ̂Ńrbg}XN쐬
	;----------------------------
	CALL 0,GR7
FIN	RPOP
	RET
BITSPW DC 16 ;̃rbg
	END
;---------------------
; rbg}XNgΏۃrbgSPɂ
SETOP 	START
	RPUSH
	LD GR3,0,GR1
	; BITAREA ̃AhX擾
	ADDL GR3,GR2
	; ΃AhX GR2Z
	; ΏۃAhX GR3m肷B
	OR    GR0   ,0  ,    GR3 ;
	; ΏۃAhX GR3̓eɑ΂
	; rbg}XN GR0 𓖂ĂB
	ST GR0,0,GR3
	; ÎŁAʂ
	; ΏۃAhXɖ߂B
	RPOP
	RET
	END
;------------------------------
; ӂɂ쐬vO
; SETOPƓ킾΂Ƀrbg}XNgΏۃrbgS0ɂ
RESETOP START
	RPUSH
	LD GR3,0,GR1
	; BITAREA ̃AhX擾
	ADDL GR3,GR2
	; ΃AhX GR2Z
	; ΏۃAhX GR3m肷B
	;------------------------
	XOR GR0,=#FFFF
	; rbg}XNGR0̂PƂO𔽓]B
	AND GR0,0,GR3 ;
	; ΏۃAhX GR3̓eɑ΂
	; rbg}XN GR0 𓖂ĂB
	ST GR0,0,GR3
	; ÎŁAʂ
	; ΏۃAhXɖ߂B
	RPOP
	RET
	END
;-----------------------------
